""""
电表遥测数据 业务层（Service）
职责：
1. 接收路由 DTO，做业务校验；
2. 调用 CRUD 完成持久化；
3. 事务边界在此层；
4. 返回 VO（视图对象）给路由层。
"""

from app.crud import telemetry_crud
from app.schemas.telemetry_schemas import (
	TelemetryListRequest,
	TelemetryListResponse,
	MeterTelemetryItem,
)
from common.database import DatabaseService
from common.exceptions import BizException, ErrorCode
from common.logger import create_logger
from common.response import PaginationParams

logger = create_logger(__name__)


class TelemetryService:
	"""电表遥测数据业务编排"""

	@staticmethod
	async def get_paged_list(
			db: DatabaseService,
			query: TelemetryListRequest,
			page: PaginationParams,
	) -> TelemetryListResponse:
		"""
		分页获取遥测数据（含总条数）
		1. 参数已在校验层完成，此处无需重复校验；
		2. 任何数据库异常转 BizException，带 ErrorCode。
		"""
		try:
			total, rows = await telemetry_crud.get_telemetry_list(
				db, query, page.page, page.size
			)
		except Exception as e:
			logger.exception("查询遥测列表异常: %s", e)
			raise BizException.from_error_code(ErrorCode.DB_QUERY_ERROR)

		# 模型 -> VO
		items = [MeterTelemetryItem.model_validate(r) for r in rows]

		# 组装分页 VO
		pages = (total + page.size - 1) // page.size
		return TelemetryListResponse(
			total=total,
			items=items,
			page=page.page,
			size=page.size,
			pages=pages,
			has_next=page.page * page.size < total,
			has_prev=page.page > 1,
		)

	@staticmethod
	async def get_by_id(db: DatabaseService, telemetry_id: int) -> MeterTelemetryItem:
		"""
		单条详情
		不存在抛 404
		"""
		row = await telemetry_crud.get_telemetry_by_id(db, telemetry_id)
		if not row:
			raise BizException.from_error_code(
				ErrorCode.NOT_FOUND, message=f"遥测记录 {telemetry_id} 不存在"
			)
		return MeterTelemetryItem.model_validate(row)
